#include <iostream>
#include <cctype>
using std::cin;
using std::cout;
using std::endl;
using std::string;

// 字符串分析
bool isNumeric(string str) {
    // 1.跳过开头的空格字符
    int i = 0;
    while (i < str.size() && str[i] == ' ') {
        i++;
    } // 此时i的值为第一个不是空格的字符的索引

    // 2.检查正负号
    if (str[i] == '+' || str[i] == '-') {
        i++;
    }

    // 3.检查数字部分
    bool hasNumeric = false;
    while (i < str.size() && isdigit(str[i])) {
        i++;
        hasNumeric = true;
    }

    // 4.检查小数点部分
    if (i < str.size() && str[i] == '.') {
        i++;
        while (i < str.size() && isdigit(str[i])) {
            i++;
            hasNumeric = true;
        }
    }

    // 5.检查科学计数法部分
    if (hasNumeric && i < str.size() && (str[i] == 'e' || str[i] == 'E')) {
        i++;
        if (i < str.size() && (str[i] == '+' || str[i] == '-')) {
            i++;
        }
        bool hasExponent = false;
        while (i < str.size() && isdigit(str[i])) {
            i++;
            hasExponent = true;
        }
        // 科学计数法必须同时存在数字和指数部分
        if (!hasExponent) {
            return false;
        }
    }

    // 6.跳过结尾的空格字符
    while (i < str.size() && str[i] == ' ') {
        i++;
    }

    // 7.最后检查是否到达了字符串结尾且没有遇到非法字符
    return i == str.size();
}

int main() {
    string input;

    while (1) {
        cout << "请输入一个字符串(输入quit退出): ";
        getline(cin, input);

        if (input == "quit") {
            cout << "您已退出" << endl;
            break;
        }

        if (isNumeric(input)) {
            cout << "是数值" << endl;
        } else {
            cout << "不是数值" << endl;
        }
    }

    return 0;
}
